1 module mruby.compile;
2 
3 import core.stdc.stdio;
4 
5 import mruby.value;
6 import mruby.mrb_class;
7 import mruby;
8 import mruby.proc;
9 
10 extern (C):
11 
12 enum mrb_lex_state_enum
13 {
14 	EXPR_BEG = 0,
15 	EXPR_END = 1,
16 	EXPR_ENDARG = 2,
17 	EXPR_ENDFN = 3,
18 	EXPR_ARG = 4,
19 	EXPR_CMDARG = 5,
20 	EXPR_MID = 6,
21 	EXPR_FNAME = 7,
22 	EXPR_DOT = 8,
23 	EXPR_CLASS = 9,
24 	EXPR_VALUE = 10,
25 	EXPR_MAX_STATE = 11
26 }
27 
28 enum mrb_string_type
29 {
30 	str_not_parsing = 0,
31 	str_squote = 1,
32 	str_dquote = 3,
33 	str_regexp = 7,
34 	str_sword = 41,
35 	str_dword = 43,
36 	str_ssym = 17,
37 	str_ssymbols = 49,
38 	str_dsymbols = 51,
39 	str_heredoc = 65,
40 	str_xquote = 131
41 }
42 
43 struct mrbc_context
44 {
45 	mrb_sym* syms;
46 	int slen;
47 	char* filename;
48 	short lineno;
49 	int function (mrb_parser_state*) partial_hook;
50 	void* partial_data;
51 	RClass* target_class;
52 	mrb_bool capture_errors;
53 	mrb_bool dump_result;
54 	mrb_bool no_exec;
55 	mrb_bool keep_lv;
56 	mrb_bool no_optimize;
57 }
58 
59 struct mrb_ast_node
60 {
61 	mrb_ast_node* car;
62 	mrb_ast_node* cdr;
63 	ushort lineno;
64 	ushort filename_index;
65 }
66 
67 struct mrb_parser_message
68 {
69 	int lineno;
70 	int column;
71 	char* message;
72 }
73 
74 struct mrb_parser_heredoc_info
75 {
76 	mrb_bool allow_indent;
77 	mrb_bool line_head;
78 	enum mrb_string_type
79 	{
80 		str_not_parsing = 0,
81 		str_squote = 1,
82 		str_dquote = 3,
83 		str_regexp = 7,
84 		str_sword = 41,
85 		str_dword = 43,
86 		str_ssym = 17,
87 		str_ssymbols = 49,
88 		str_dsymbols = 51,
89 		str_heredoc = 65,
90 		str_xquote = 131
91 	}
92 	mrb_string_type type;
93 	const(char)* term;
94 	int term_len;
95 	mrb_ast_node* doc;
96 }
97 
98 struct mrb_parser_state
99 {
100 	mrb_state* mrb;
101 	mrb_pool* pool;
102 	mrb_ast_node* cells;
103 	const(char)* s;
104 	const(char)* send;
105 	FILE* f;
106 	mrbc_context* cxt;
107 	const(char)* filename;
108 	int lineno;
109 	int column;
110 	enum mrb_lex_state_enum
111 	{
112 		EXPR_BEG = 0,
113 		EXPR_END = 1,
114 		EXPR_ENDARG = 2,
115 		EXPR_ENDFN = 3,
116 		EXPR_ARG = 4,
117 		EXPR_CMDARG = 5,
118 		EXPR_MID = 6,
119 		EXPR_FNAME = 7,
120 		EXPR_DOT = 8,
121 		EXPR_CLASS = 9,
122 		EXPR_VALUE = 10,
123 		EXPR_MAX_STATE = 11
124 	}
125 	mrb_lex_state_enum lstate;
126 	mrb_ast_node* lex_strterm;
127 	uint cond_stack;
128 	uint cmdarg_stack;
129 	int paren_nest;
130 	int lpar_beg;
131 	int in_def;
132 	int in_single;
133 	mrb_bool cmd_start;
134 	mrb_ast_node* locals;
135 	mrb_ast_node* pb;
136 	char[1024] buf;
137 	int bidx;
138 	mrb_ast_node* all_heredocs;
139 	mrb_ast_node* heredocs_from_nextline;
140 	mrb_ast_node* parsing_heredoc;
141 	mrb_ast_node* lex_strterm_before_heredoc;
142 	mrb_bool heredoc_end_now;
143 	void* ylval;
144 	size_t nerr;
145 	size_t nwarn;
146 	mrb_ast_node* tree;
147 	mrb_bool no_optimize;
148 	mrb_bool capture_errors;
149 	mrb_parser_message[10] error_buffer;
150 	mrb_parser_message[10] warn_buffer;
151 	mrb_sym* filename_table;
152 	size_t filename_table_length;
153 	int current_filename_index;
154 	mrb_jmpbuf* jmp;
155 }
156 
157 struct mrb_jmpbuf;
158 
159 
160 mrbc_context* mrbc_context_new (mrb_state* mrb);
161 void mrbc_context_free (mrb_state* mrb, mrbc_context* cxt);
162 const(char)* mrbc_filename (mrb_state* mrb, mrbc_context* c, const(char)* s);
163 void mrbc_partial_hook (mrb_state* mrb, mrbc_context* c, int function (mrb_parser_state*) partial_hook, void* data);
164 mrb_value mrb_toplevel_run_keep (mrb_state*, RProc*, uint);
165 mrb_parser_state* mrb_parser_new (mrb_state*);
166 void mrb_parser_free (mrb_parser_state*);
167 void mrb_parser_parse (mrb_parser_state*, mrbc_context*);
168 void mrb_parser_set_filename (mrb_parser_state*, const(char)*);
169 const(char)* mrb_parser_get_filename (mrb_parser_state*, ushort idx);
170 mrb_parser_state* mrb_parse_file (mrb_state*, FILE*, mrbc_context*);
171 mrb_parser_state* mrb_parse_string (mrb_state*, const(char)*, mrbc_context*);
172 mrb_parser_state* mrb_parse_nstring (mrb_state*, const(char)*, int, mrbc_context*);
173 RProc* mrb_generate_code (mrb_state*, mrb_parser_state*);
174 mrb_value mrb_load_file (mrb_state*, FILE*);
175 mrb_value mrb_load_string (mrb_state* mrb, const(char)* s);
176 mrb_value mrb_load_nstring (mrb_state* mrb, const(char)* s, int len);
177 mrb_value mrb_load_file_cxt (mrb_state*, FILE*, mrbc_context* cxt);
178 mrb_value mrb_load_string_cxt (mrb_state* mrb, const(char)* s, mrbc_context* cxt);
179 mrb_value mrb_load_nstring_cxt (mrb_state* mrb, const(char)* s, int len, mrbc_context* cxt);